package com.mesystem.managedbean;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.mesystem.dto.RegistroDTO;
import com.mesystem.service.RegistroService;
import com.mesystem.util.Constantes;
import com.mesystem.util.PropertiesUtil;
import com.mesystem.util.Util;
import com.mesystem.vo.ComboGeneral;

public class RegistroMB extends GeneralMB{
	
	private static final Logger logger = Logger.getLogger(RegistroMB.class);
	
	private RegistroService getRegistroService(){
		return (RegistroService)getBean("registroService");
	}
	
	private String anio;
	private String mes;
	private boolean bflagConfirmEliReg;
	private boolean bflagCalcTot;
	
	
	private List<ComboGeneral> lstAnio;
	private List<ComboGeneral> lstMeses;
	
	private RegistroDTO objRegistroMain;
	private List<RegistroDTO> lstRegistros;
	private List<RegistroDTO> lstTotales;
	
	private int iCanRegTablaPrincipal;
	private int iCanRegTablaTotales;
	
	public RegistroMB() {
		lstRegistros = new ArrayList<RegistroDTO>();
		objRegistroMain = new RegistroDTO();
		this.cargarCombos();
	}
	
	private void cargarCombos(){
		logger.info("CargarCombos");
		if(lstAnio == null){
			lstAnio = new ArrayList<ComboGeneral>();
			int anioActual = Util.getAnioActual();
			int resta = Integer.parseInt(PropertiesUtil.getParamConfiguracion(Constantes.YEAR_DISM_VALUE));
			for(int i=0;i<=resta;i++){
				lstAnio.add(new ComboGeneral(String.valueOf(i+1), String.valueOf(anioActual-i)));
			}
			logger.info("lstAnio: "+lstAnio.size());
		}
		if(lstMeses == null){
			lstMeses = new ArrayList<ComboGeneral>();
			String[] arrMeses = Constantes.MONTH_LIST.split(Constantes.SEPARADOR1);
			for(int i=0;i<arrMeses.length;i++){
				lstMeses.add(new ComboGeneral(Util.getValorMes(arrMeses[i]), arrMeses[i]));
			}
			logger.info("lstMeses: "+lstMeses.size());
		}
	}
	
	public void buscarRegistros(){
		try {
			this.consultarRegistros();
			if(iCanRegTablaPrincipal == 0){
				mensajeInfo("", "No hay Registros para la fecha seleccionada.");
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			mensajeError("", "Ocurrio un error al buscar los registros.");
		}
	}
	
	public void openAgregarRegistro(){
		objRegistroMain = new RegistroDTO();
	}
	
	public void openEditarRegistro(){
		/*logger.info("openEditarRegistro");
		objRegistro = new RegistroDTO();
		Map<String, String> paramMap = getParameterMapRequest();
		int codReg = Integer.parseInt(paramMap.get("codReg"));
		logger.info("codReg: "+codReg);*/
	}
	
	public void visibleConfirmElimRegistro(){
		this.bflagConfirmEliReg = true;
	}
	
	public void insertaRegistro(){
		try {
			if(!this.preparaObjetoRegistro()){
				return;
			}
			
			if(!getRegistroService().validaRegistro(objRegistroMain)){
				mensajeError("Registro Repetido", "Ya se ha realizado el registro para la fecha seleccionada");
				return;
			}
			getRegistroService().insertaRegistro(objRegistroMain);
			this.anio = objRegistroMain.getAnio();
			this.mes = objRegistroMain.getMes();
			this.consultarRegistros();
			mensajeInfo("", "Registro Exitoso");
			objRegistroMain = new RegistroDTO();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			mensajeError("Error", "Ocurrio un error al insertar el registro.");
		}
	}

	public void editarRegistro(){
		try {
			getRegistroService().actualizaRegistro(objRegistroMain);
			this.consultarRegistros();
			mensajeInfo("", "Actualizacion Exitosa");
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			mensajeError("Error", "Ocurrio un error al actualizar el registro.");
		}
	}
	
	public void eliminarRegistro(){
		try {
			getRegistroService().eliminarRegistro(objRegistroMain.getId());
			this.consultarRegistros();
			mensajeInfo("", "Eliminacion Exitosa");
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			mensajeError("Error", "Ocurrio un error al eliminar el registro.");
		}
	}
	
	public void calcularTotales(){
		if(!this.bflagCalcTot){
			mensajeError("", "No hay Registros para calcular");
			bloqueaComplete();
			return;
		}
		lstTotales = new ArrayList<RegistroDTO>();
		BigDecimal horas = BigDecimal.ZERO;
		int revistas = 0;
		int revisitas = 0;
		int folletos = 0;
		for(RegistroDTO reg: lstRegistros){
			horas = horas.add(reg.getHoras());
			revistas += reg.getRevistas();
			revisitas += reg.getRevisitas();
			folletos += reg.getFolletos();
		}
		lstTotales.add(new RegistroDTO(1, null, anio, mes, Util.getDescMes(mes), null, horas, revistas, revisitas, folletos, 0, null));
		iCanRegTablaTotales = lstTotales.size();
		ejecutaComplete("dlgVerTotales.show()");
	}
	
	private void consultarRegistros() throws Exception{
		int idUsuario = (Integer)getObjectInSession("idusua");
		logger.info("idUsuario: "+idUsuario);
		logger.info("anio: "+anio);
		logger.info("mes: "+mes);
		lstRegistros = getRegistroService().listarRegistros(idUsuario, anio, mes);
		iCanRegTablaPrincipal = lstRegistros.size();
		if(iCanRegTablaPrincipal > 0){
			bflagCalcTot = true;
		}
	}
	
	private boolean preparaObjetoRegistro() {
		if(objRegistroMain.getFechaRegistro() == null){
			mensajeError("Datos Requeridos", "Seleccione Fecha de Registro");
			return false;
		}
		if(objRegistroMain.getHoras() == null || objRegistroMain.getHoras().compareTo(BigDecimal.ZERO) <= 0){
			mensajeError("Datos Requeridos", "Ingrese un valor de horas mayor a Cero");
			return false;
		}
		
		objRegistroMain.setIdUsuario((Integer)getObjectInSession("idusua"));
		objRegistroMain.setAnio(Util.getValoresFecha(Constantes.YEAR_FORMAT, objRegistroMain.getFechaRegistro()));
		objRegistroMain.setMes(Util.getValoresFecha(Constantes.MONTH_FORMAT, objRegistroMain.getFechaRegistro()));
		objRegistroMain.setDia(Util.getValoresFecha(Constantes.DAY_FORMAT, objRegistroMain.getFechaRegistro()));
		return true;
	}
	
	public String getAnio() {
		return anio;
	}

	public void setAnio(String anio) {
		this.anio = anio;
	}

	public String getMes() {
		return mes;
	}

	public void setMes(String mes) {
		this.mes = mes;
	}

	public boolean isBflagConfirmEliReg() {
		return bflagConfirmEliReg;
	}

	public void setBflagConfirmEliReg(boolean bflagConfirmEliReg) {
		this.bflagConfirmEliReg = bflagConfirmEliReg;
	}

	public boolean isBflagCalcTot() {
		return bflagCalcTot;
	}

	public void setBflagCalcTot(boolean bflagCalcTot) {
		this.bflagCalcTot = bflagCalcTot;
	}

	public List<ComboGeneral> getLstAnio() {
		return lstAnio;
	}

	public void setLstAnio(List<ComboGeneral> lstAnio) {
		this.lstAnio = lstAnio;
	}

	public List<ComboGeneral> getLstMeses() {
		return lstMeses;
	}

	public void setLstMeses(List<ComboGeneral> lstMeses) {
		this.lstMeses = lstMeses;
	}

	public RegistroDTO getObjRegistroMain() {
		return objRegistroMain;
	}

	public void setObjRegistroMain(RegistroDTO objRegistroMain) {
		this.objRegistroMain = objRegistroMain;
	}

	public List<RegistroDTO> getLstRegistros() {
		return lstRegistros;
	}

	public void setLstRegistros(List<RegistroDTO> lstRegistros) {
		this.lstRegistros = lstRegistros;
	}

	public List<RegistroDTO> getLstTotales() {
		return lstTotales;
	}

	public void setLstTotales(List<RegistroDTO> lstTotales) {
		this.lstTotales = lstTotales;
	}

	public int getiCanRegTablaPrincipal() {
		return iCanRegTablaPrincipal;
	}

	public void setiCanRegTablaPrincipal(int iCanRegTablaPrincipal) {
		this.iCanRegTablaPrincipal = iCanRegTablaPrincipal;
	}

	public int getiCanRegTablaTotales() {
		return iCanRegTablaTotales;
	}

	public void setiCanRegTablaTotales(int iCanRegTablaTotales) {
		this.iCanRegTablaTotales = iCanRegTablaTotales;
	}
	
}
